#ifndef CHATWIDGET_H
#define CHATWIDGET_H

#include <QWidget>
#include <QUdpSocket>
#include "tcpserver.h"
#include<QKeyEvent>



// 标记消息类型：消息，新用户加入，用户退出，文件名，拒绝接收文件
enum MessageType {
    Message,
    NewParticipant,
    ParticipantLeft,
    Filename,
    Refuse
};

namespace Ui {
class chatWidget;
}

class chatWidget : public QWidget
{
    Q_OBJECT

public:
    explicit chatWidget(QWidget *parent = nullptr);
    ~chatWidget();
protected:
    // 处理新用户加入的函数，接收新用户的信息，更新界面等
    void newParticipant(QString username, QString localHostName, QString idAddress);
    // 处理用户离开的函数，接收离开用户的信息，更新界面等
    void participantLeft(QString username, QString localHostName,QString time);
    // 发送消息的函数，根据不同的消息类型和服务器地址发送不同的消息
    void sendMessage(MessageType type, QString serverAddress="");
    // 获取系统 IP 地址的函数
    QString getIP();
    // 获取系统用户名的函数
    QString getUsername();
    // 获取用户输入的消息内容的函数
    QString getMessage();
    // 处理有文件等待接收的情况，接收文件相关信息，询问用户是否接收文件等操作
    void hasPendingFile(QString userName, QString serverAddress, QString clientAddress, QString fileName);


private:
    // Ui::chatWidget *ui;

private slots:
    // 当接收到文件名时调用的槽函数，可能用于后续的文件传输操作
    void getFileName(QString);
    // 处理 UDP 接收到的数据报的槽函数，根据不同的消息类型调用相应的处理函数
    void processPendingDatagrams();
    // 当点击发送按钮时调用的槽函数，可能用于发送普通消息
    void on_sendButton_clicked();
    // 当点击发送工具按钮时调用的槽函数，可能用于开启文件传输等操作
    void on_sendToolBtn_clicked();

    //按下回车键登录
    void keyPressEvent(QKeyEvent* event);


private:
    // UI 指针，用于操作界面元素
    Ui::chatWidget *ui;
    // UDP 套接字，用于发送和接收 UDP 消息
    QUdpSocket *udpSocket;
    // UDP 端口号，用于绑定 UDP 套接字
    qint16 port;
    // 存储文件名，可能用于文件传输操作
    QString fileName;
    // TCP 服务器对象，用于文件传输等操作
    TcpServer *server;


};

#endif // CHATWIDGET_H



